﻿#ifndef UIM_H
#define UIM_H

#include <qlibrary.h>

#include "tool.h"
#include "fsConfig.h"
#include "UISimCanFunc_RT.h"



/************************************************************************************
UIM 电机配置                ID  电机转向    细分      电流      S1-IN       S2-IN
胶片扫描控制
    Right   右卷电机-       5    1        16       0.8
    Focus   上下电机-       6    0        16       1.8

异常问题：
********************************************************************************************/

typedef struct _UIM_PARA
{
    int             bENA;           //电机使能状态
    int             bDIR;           //电机方向
    int             bACR;           //电流减半
    unsigned int    uiMCS;          //电机细分
    unsigned int    uiCUR;          //电流
    int             uiSPD;          //当前速度
    int             uiSTP;          //当前步长
}UIM_PARA;


class UIM
{

public:
    UIM(const QString dllName);
    ~UIM();
    int ret;

    void Init(void);

    fsConfig *conf;
    qint64  curFramePosTimer;
    int     curFramePosCounter;

    //Pos
    bool getPos(void);
    bool isPosOver(int timer);

    bool isOpen(void);
//    void setOpen(bool en);
    int getIndex(void);
    QStringList getList(void);

    // CAN 函数
    void canSearch(void);
    static int compare(const void *first, const void *second);
    bool canOpenGateWay(void);
    void canCloseGateWay(void);

    bool canEna(bool &en,int id, const QString msg="", UIM_PARA *para = nullptr);
    bool canOff(bool &en,int id, const QString msg="", UIM_PARA *para = nullptr);
    //上下焦距
    void canFocusEna(bool en=false);
    void canFocusOff(bool en=false);
    int getFocusId(void);
    int getFocusPos(void);
    int getFocusMoveStep(void);
    bool isFocusId(int id=0);
    bool isFocus(void);
    // bool getCanFocus1(void);
    // void setCanFocus1(bool in);
    // bool getCanFocus2(void);
    // void setCanFocus2(bool in);
    int getCanFocusMoveDirection(void);
    void setCanFocusMoveDirection(int mv);
    int getCanFocusRevStep(void);
    void setCanFocusRevStep(int step);
    //右卷片
    void canRightEna(bool en=false);
    void canRightOff(bool en=false);
    int getRightId(void);
    int getRightPos(void);
    bool isRightId(int id=0);
    bool isRight(void);
    bool isRightMove(void);
    //电机移动
    void canSetSPD(int index,int spd);
    void canSetSTP(int index,int stp);
    void canStop(int index);
    void canSetOrg(int index);
    int canGetPos(int index);
    void canSetPOS(int index,int pos);
    void canSetQec(int index);
    int canGetQec(int index);
    //寄存器
    UIM_PARA *getRightPara(void);
    UIM_PARA *getFocusPara(void);

//    bool canGetAck(int index,int &Mcs,int &Cur);
//    int canGetMcs(int index);
//    int canGetCur(int index);
//    int canSetMcs(int index, int mcs);
//    int canSetCur(int index, int cur);
    bool isCanSet(const int id);

private:
    UIM_PARA canRightPara;
    UIM_PARA canFocusPara;

    //CAN变量
    int canGatewayCount;
    unsigned int canCurGatewayIndex;
    bool isCanGateway;
    unsigned int canGatewayIndex[5];
    QStringList canGatewayNameList;
    int canNodeLen;

    //右收片
    bool isCanRightEnable;
    int canRightNodeId;
    int canRightStep;
    bool isCanRightMove;
    qint64  curPosTimer;
    int     curPosCounter;
    //焦距
    bool isCanFocusEnable;
    int canFocusNodeId;
    // bool isCanFocusS1;
    // bool isCanFocusS2;
    int isCanFocusMove;
    bool isCanFocusMoveType;
    int canFocusStep;
    int canFocusPos;
    //停止运动后反向运动
    int canFocusRevStep;
};

#endif // UIM_H
